home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1995-12-14 | 14.8 KB | 409 lines | [TEXT/.Ob4] |
- Syntax10.Scn.Fnt
- StampElems
- Alloc
- 14 Dec 95
- InfoElems
- Alloc
- Syntax10.Scn.Fnt
- StampElems
- Alloc
- 14 Dec 95
- "Title": Run time debugger
- "Author": mah
- "Abstract": data texts module
- "Keywords":
- "Version":
- "From": 31.1.95 11:49:38
- "Until":
- "Changes":
- 20.03.95 : statt = jetzt : bei arrays
- 28.03.95 FoldElems be records & arrays komprimierter
- ParcElems
- Alloc
- Syntax10i.Scn.Fnt
- FoldElems
- Syntax10.Scn.Fnt
- indent : INTEGER;
- obj: RTDC.Sym;
- adr: LONGINT;
- END;
- Syntax10.Scn.Fnt
- indent: INTEGER;
- writer: Texts.Writer;
- text: Texts.Text;
- baseAdr: LONGINT;
- reg: Sys.ExceptionInfo
- END;
- Syntax10b.Scn.Fnt
- Syntax10.Scn.Fnt
- VAR e: FoldElem;
- BEGIN
- NEW (e); e.mode := mode; e.W := FoldElems.elemW; e.H := FoldElems.elemH; e.handle := FoldElemHandler;
- e.obj:=obj; e.adr:=adr; e.indent:=indent; e.visible:=TRUE;
- IF (mode = FoldElems.expLeft) OR (mode = FoldElems.colLeft) THEN NEW (e.hidden); Texts.OpenBuf (e.hidden) END;
- RETURN e
- END AllocFoldElem;
- Syntax10.Scn.Fnt
- VAR i : INTEGER;
- BEGIN FOR i := 1 TO in DO Texts.Write (w, 09X) END
- END WriteIndent;
- Syntax10.Scn.Fnt
- Syntax10i.Scn.Fnt
- c: CHAR;
- l: LONGINT;
- i: INTEGER;
- r: REAL;
- lr: LONGREAL;
- s: SET;
- si: SHORTINT;
- name: ARRAY 64 OF CHAR;
- first: BOOLEAN;
- BEGIN
- CASE o.typ.form OF
- Byte:
- IF reg THEN SYS.GET (adr, l); c := CHR(SHORT(SHORT(l))) ELSE SYS.GET (adr, c) END;
- Texts.WriteInt (w, ORD(c), 0)
- | Bool:
- IF reg THEN
- IF adr # 0 THEN c := CHR (1) ELSE c := CHR (0) END
- ELSE
- SYS.GET (adr, c)
- END;
- IF ORD (c) # 0 THEN Texts.WriteString(w, "TRUE") ELSE Texts.WriteString(w, "FALSE") END
- | Char:
- IF reg THEN SYS.GET (adr, l); c := CHR (SHORT (SHORT (l))) ELSE SYS.GET (adr, c) END;
- IF (c < ' ') OR (c > '~') THEN
- Texts.WriteString (w, "CHR (");
- Texts.WriteInt (w, ORD(c), 0);
- Texts.Write (w, ')')
- ELSE
- Texts.Write (w, 27X); Texts.Write (w, c); Texts.Write (w, 27X)
- END
- | SInt:
- IF reg THEN SYS.GET (adr, l); si := SHORT (SHORT (l)) ELSE SYS.GET (adr, si) END;
- Texts.WriteInt (w, si, 0)
- | Int:
- IF reg THEN SYS.GET (adr, l) ELSE SYS.GET (adr, i); l := i END;
- Texts.WriteInt (w, l, 0)
- | LInt:
- SYS.GET (adr, l);
- Texts.WriteInt (w, l, 0)
- | Real:
- IF reg THEN SYS.GET (adr, lr); r := SHORT (lr) ELSE SYS.GET (adr, r) END;
- Texts.WriteLongReal (w, r, 15)
- | LReal:
- SYS.GET (adr, lr);
- Texts.WriteLongReal (w, lr, 20)
- | Set:
- SYS.GET (adr, s);
- first := TRUE;
- Texts.Write (w, '{');
- FOR i := 0 TO 31 DO
- IF i IN s THEN
- IF ~first THEN Texts.WriteString (w, ", ") END;
- Texts.WriteInt (w, i, 0);
- first := FALSE
- END
- END;
- Texts.Write (w, '}')
- |Pointer: Texts.WriteString (w, "NIL") (* only nil pointers handled here *)
- |ProcTyp:
- SYS.GET (adr, l);
- RTDT.FindProc (l, name);
- IF name = "" THEN
- Texts.WriteHex (w, l); Texts.Write (w, 'H')
- ELSE
- Texts.WriteString (w, name)
- END
- |Comp: (* array of char *)
- RTDT.ConvertAdr (adr);
- IF o.typ.comp = DynArr THEN SYS.GET (adr, o.typ.n); INC (adr, 4)
- ELSIF o.typ.comp = -Array THEN o.typ.comp := DynArr
- END;
- SYS.GET (adr, c);
- Texts.Write (w, '"');
- i := 1;
- WHILE c#CHR(0) DO Texts.Write (w, c); SYS.GET (adr+i, c); INC (i) END;
- Texts.Write (w, '"')
- ELSE
- Texts.WriteString (w, "Unknown type")
- END ShowValue;
- Syntax10.Scn.Fnt
- BEGIN adr := baseAdr + o.adr
- END CalcGlobalAdr;
- Syntax10.Scn.Fnt
- VAR nxt, l: LONGINT;
- BEGIN
- IF o.linkadr < 0 THEN
- reg := TRUE;
- adr := -1 - o.linkadr;
- adr := adr MOD 32;
- IF (o.typ.comp = Record) & (o.mode = 2) THEN
- SYS.GET (regs.reg.R[2 * adr + 3] - 4, l); o.adr := l - 2
- ELSIF (o.typ.comp = DynArr) & (o.mode # 2) THEN
- SYS.GET (regs.reg.R[2 * adr + 3] - 4, l); o.adr := l - 2
- ELSE
- o.adr := 0
- END;
- IF adr < 31 THEN nxt := regs.reg.R[2 * adr + 3] END;
- IF o.typ.form = ProcTyp THEN adr := SYS.ADR (regs.reg.R[2 * adr + 1])
- ELSIF o.typ.form = Bool THEN
- IF adr IN SYS.VAL(SET, regs.spec.CR) THEN adr := 1 ELSE adr := 0 END
- ELSE
- IF (o.typ.form = LReal) OR (o.typ.form = Real) THEN
- adr := SYS.ADR (regs.fp.R[2 * adr])
- ELSE
- adr := SYS.ADR (regs.reg.R[2 * adr + 1])
- END
- END
- ELSE
- reg := FALSE;
- adr := o.linkadr + regs.reg.R[2 * 31 + 1]
- END;
- IF (o.mode = 2) OR ((o.typ.form = Comp) & (o.typ.comp = DynArr)) THEN SYS.GET (adr, adr); reg := FALSE END;
- IF (o.typ.form = Comp) & (o.typ.comp = DynArr) THEN
- o.typ.n := nxt;
- o.typ.comp := -Array
- END CalcLocalAdr;
- Syntax10.Scn.Fnt
- Syntax10i.Scn.Fnt
- VAR l : LONGINT;
- BEGIN
- IF (o.typ.form = Comp) & (ABS (o.typ.comp) = Array) &
- (o.typ.BaseTyp.strobj # NIL) &
- (o.typ.BaseTyp.strobj.name = "CHAR") THEN (* array of char as string *)
- RETURN FALSE
- END;
- IF o.typ.form = Comp THEN RETURN TRUE END; (* arrays & records *)
- IF o.typ.form # Pointer THEN RETURN FALSE END;
- SYS.GET (adr, l);
- IF l = 0 THEN RETURN FALSE END; (* pointer to NIL *)
- RETURN TRUE
- END IsComplex;
- Syntax10.Scn.Fnt
- VAR r: Texts.Reader; f: FoldElem;
- l1, l2: LONGINT;
- BEGIN
- IF t # NIL THEN
- Texts.OpenReader (r, t, 0); Texts.ReadElem (r);
- WHILE ~r.eot DO
- IF r.elem IS FoldElem THEN
- f := r.elem(FoldElem);
- IF f.mode = FoldElems.expLeft THEN
- l1 := adr; l2 := f.adr;
- IF type.form = 13 THEN
- SYS.GET (adr, l1); SYS.GET (f.adr, l2);
- END;
- (* IF (f.adr = adr) & (f.obj.typ = type) THEN RETURN f.mode = FoldElems.expLeft END *)
- IF (l1 = l2) & (f.obj.typ = type) & (f.indent = indent) THEN RETURN f.mode = FoldElems.expLeft END
- END;
- Texts.ReadElem (r)
- END
- END;
- RETURN FALSE
- END Opened;
- Syntax10.Scn.Fnt
- Syntax10i.Scn.Fnt
- VAR o: RTDC.Sym; t: Types.Type;
- BEGIN
- IF (obj.mode = 2) & (obj.adr # 0) THEN (* record as var par or record by pointer *)
- t := SYS.VAL (Types.Type, obj.adr)
- END;
- IF SYS.VAL (LONGINT, t) = -1 THEN RETURN END;
- IF (t # NIL) & (t.name[0] # CHR(0)) THEN o := RTDC.FindType (t, t.module) END;
- (* IF o # NIL THEN obj.typ := o.typ END *)
- END GetType;
- Syntax10.Scn.Fnt
- dim, i, j: LONGINT;
- sn, s, sb: RTDC.Type;
- n: ARRAY 20 OF LONGINT;
- BEGIN
- dim := o.typ.n;
- s := o.typ;
- FOR i := 0 TO dim DO
- NEW (sn); sn^ := s^; sn.comp := 2;
- IF i = 0 THEN o.typ := sn ELSE sb.BaseTyp := sn END;
- sb := sn;
- SYS.GET (adr + 4 * i + 12, sn.n);
- n[i] := sn.n;
- s := s.BaseTyp
- END;
- sn := o.typ; i := dim;
- REPEAT
- s := o.typ;
- j := 0; WHILE j # i DO INC (j); s := s.BaseTyp END;
- s.size := n[i] * s.BaseTyp.size;
- DEC (i)
- UNTIL i = -1;
- adr := adr + 12 + 4 * (dim + 1);
- INC (adr, (-adr) MOD 8)
- END ConvertDynamic;
- Syntax10.Scn.Fnt
- Syntax10i.Scn.Fnt
- obj: RTDC.Sym;
- i, a: LONGINT;
- BEGIN
- IF o.typ.form = Pointer THEN
- SYS.GET (adr, adr);
- SYS.GET (adr - 4, a);
- SYS.GET (a - 4, a); (* fetch super tag *)
- NEW (obj); obj^ := o^; o := obj;
- o.adr := a - 2; (* remove mark bit *)
- o.mode := 2; (* mark for possible different runtimetype *)
- o.typ:=o.typ.BaseTyp
- END;
- IF o.typ.comp = DynArr THEN
- ConvertDynamic (o, adr);
- END;
- NEW (obj);
- obj.typ:=o.typ.BaseTyp;
- IF ABS (o.typ.comp) = Array THEN
- IF IsComplex (o, adr) THEN
- FOR i := 0 TO o.typ.n-1 DO
- Texts.WriteLn (w);
- WriteIndent (w, indent);
- IF IsComplex (obj, adr + i * obj.typ.size) THEN
- IF obj.typ.comp = Record THEN Texts.WriteString (w, "RECORD ")
- ELSIF obj.typ.comp = Array THEN Texts.WriteString (w, "ARRAY ")
- ELSE Texts.WriteString (w, "POINTER ")
- END;
- Texts.WriteInt (w, i, 0); Texts.Write (w, ' ');
- IF Opened (t, adr+i*obj.typ.size, obj.typ, indent) THEN
- Texts.WriteElem (w, AllocFoldElem (obj, adr+i*obj.typ.size, indent + 1, FoldElems.expLeft));
- ShowExpansion (w, obj, adr+i*obj.typ.size, indent + 1, t);
- Texts.WriteElem (w, AllocFoldElem (obj, adr+i*obj.typ.size, indent + 1, FoldElems.expRight))
- ELSE
- Texts.WriteElem (w, AllocFoldElem (obj, adr+i*obj.typ.size, indent + 1, FoldElems.colLeft));
- Texts.WriteElem (w, AllocFoldElem (obj, adr+i*obj.typ.size, indent + 1, FoldElems.colRight))
- END
- ELSE
- Texts.WriteInt (w, i, 0); Texts.WriteString (w, ": ");
- ShowValue (w, obj, adr + i * o.typ.BaseTyp.size, FALSE)
- END
- END
- ELSE (* ARRAY OF CHAR *)
- Texts.Write (w, ' ');
- ShowValue (w, o, adr, FALSE)
- END;
- Texts.Write (w, ' ')
- ELSE (* record *)
- IF o.mode = 2 THEN GetType (o, adr) END; (* determine runtime type *)
- IF o.typ.BaseTyp#NIL THEN
- obj.typ := o.typ.BaseTyp;
- Texts.Write (w, ' ');
- IF Opened (t, adr, obj.typ, indent) THEN
- Texts.WriteElem (w, AllocFoldElem (obj, adr, indent, FoldElems.expLeft));
- ShowExpansion (w, obj, adr, indent, t);
- Texts.WriteElem (w, AllocFoldElem (obj, adr, indent, FoldElems.expRight))
- ELSE
- Texts.WriteElem (w, AllocFoldElem (obj, adr, indent, FoldElems.colLeft));
- Texts.WriteElem (w, AllocFoldElem (obj, adr, indent, FoldElems.colRight))
- END
- END;
- Texts.WriteLn (w);
- GetScope (w, t, o.typ.link, adr, indent);
- Texts.Write (w, ' ')
- END ShowExpansion;
- Syntax10.Scn.Fnt
- VAR w: Texts.Writer; new: FoldElem;
- BEGIN
- WITH e: FoldElem DO
- IF (m IS FoldElems.PrepSwitchMsg) & (e.mode = FoldElems.colLeft) THEN
- Texts.OpenWriter (w);
- ShowExpansion (w, e.obj, e.adr, e.indent, Texts.ElemBase (e));
- e.hidden := w.buf
- ELSIF m IS Texts.CopyMsg THEN
- NEW (new); Texts.CopyElem (e, new);
- new.mode := e.mode; new.visible := e.visible;
- IF e.mode IN {FoldElems.colLeft, FoldElems.expLeft, FoldElems.tempLeft, FoldElems.findLeft} THEN
- NEW(new.hidden); Texts.OpenBuf(new.hidden); Texts.Copy(e.hidden, new.hidden)
- END;
- m(Texts.CopyMsg).e := new
- ELSE
- FoldElems.FoldHandler (e, m)
- END
- END FoldElemHandler;
- Syntax10.Scn.Fnt
- VAR v, old: View;
- BEGIN
- NEW (v); v.indent := indent; v.baseAdr := baseAdr; v.text := t; v.writer := w;
- old := curView; curView := v;
- inhibit := TRUE; RTDC.ScanScope (syms, CollectProc);
- w := v.writer; curView := old
- END GetScope;
- Syntax10.Scn.Fnt
- VAR v, old: View;
- BEGIN
- NEW (v); v.indent := indent; v.reg := reg; v.text := t; v.writer := w;
- old := curView; curView := v;
- inhibit := TRUE; RTDC.ScanScope (syms, CollectProc);
- w := v.writer; curView := old
- END GetLocalScope;
- MODULE RTDD; (* Run time debugger: Data texts; mah 31.1.95 (
- IMPORT RTDT, RTDC, Texts, TextFrames, SYS := SYSTEM, FoldElems, Modules, Types, Sys;
- CONST
- (* structure forms *)
- Undef = 0; Byte = 1; Bool = 2; Char = 3; SInt = 4; Int = 5; LInt = 6;
- Real = 7; LReal = 8; Set = 9; String = 10; NilTyp = 11; NoTyp = 12;
- Pointer = 13; ProcTyp = 14; Comp = 15;
- (* composite structure forms *)
- Basic = 1; Array = 2; DynArr = 3; Record = 4;
- FoldElem = POINTER TO FoldElemDesc;
- FoldElemDesc = RECORD (FoldElems.ElemDesc)
- View = POINTER TO ViewDesc;
- ViewDesc = RECORD
- curView: View;
- inhibit: BOOLEAN;
- PROCEDURE ^FoldElemHandler (e: Texts.Elem; VAR m: Texts.ElemMsg);
- PROCEDURE ^GetScope* (VAR w: Texts.Writer; t: Texts.Text; syms: RTDC.Sym; baseAdr: LONGINT; indent: INTEGER);
- PROCEDURE AllocFoldElem (obj: RTDC.Sym; adr: LONGINT; indent: INTEGER; mode: SHORTINT) : FoldElem;
- PROCEDURE WriteIndent (VAR w: Texts.Writer; in : INTEGER);
- Write 'in' tabs
- PROCEDURE ShowValue (VAR w: Texts.Writer; o : RTDC.Sym; adr : LONGINT; reg : BOOLEAN);
- PROCEDURE CalcGlobalAdr (baseAdr: LONGINT; o: RTDC.Sym; VAR adr: LONGINT);
- PROCEDURE CalcLocalAdr (regs: Sys.ExceptionInfo; o: RTDC.Sym; VAR adr: LONGINT; VAR reg: BOOLEAN);
- PROCEDURE IsComplex (o : RTDC.Sym; adr : LONGINT) : BOOLEAN;
- PROCEDURE Opened (t: Texts.Text; adr: LONGINT; type: RTDC.Type; indent: INTEGER) : BOOLEAN;
- PROCEDURE GetType (VAR obj: RTDC.Sym; adr: LONGINT);
- converts obj.typ to actual runtime type
- PROCEDURE ConvertDynamic (VAR o: RTDC.Sym; VAR adr: LONGINT);
- converts DynArray to Array
- PROCEDURE ShowExpansion (VAR w: Texts.Writer; o: RTDC.Sym; adr: LONGINT; indent: INTEGER; t: Texts.Text);
- PROCEDURE FoldElemHandler (e: Texts.Elem; VAR m: Texts.ElemMsg);
- PROCEDURE CollectProc (obj: RTDC.Sym);
- VAR reg: BOOLEAN; adr, l: LONGINT; e: FoldElem;
- BEGIN
- IF (obj.mode # 1) & (obj.mode # 2) & (obj.mode # 4) THEN RETURN END; (* VAR, VARPAR, FIELD *)
- IF obj.name[0] = '@' THEN RETURN END;
- IF curView.reg = NIL THEN
- CalcGlobalAdr (curView.baseAdr, obj, adr); reg := FALSE
- ELSE
- CalcLocalAdr (curView.reg, obj, adr, reg)
- END;
- IF inhibit THEN inhibit := FALSE ELSE Texts.WriteLn (curView.writer) END;
- RTDT.ConvertAdr (adr);
- WriteIndent (curView.writer, curView.indent); Texts.WriteString (curView.writer, obj.name);
- IF obj.typ.form = 13 THEN Texts.Write (curView.writer, '^') END;
- Texts.Write (curView.writer, ' ');
- IF IsComplex (obj, adr) THEN
- IF Opened (curView.text, adr, obj.typ, curView.indent + 1) THEN
- e := AllocFoldElem (obj, adr, curView.indent + 1, FoldElems.expLeft);
- Texts.WriteElem (curView.writer, e);
- ShowExpansion (curView.writer, obj, adr, curView.indent + 1, curView.text);
- e := AllocFoldElem (obj, adr, curView.indent + 1, FoldElems.expRight);
- Texts.WriteElem (curView.writer, e)
- ELSE
- e := AllocFoldElem (obj, adr, curView.indent + 1, FoldElems.colLeft);
- Texts.WriteElem (curView.writer, e);
- (* IF obj.typ.form = 13 THEN SYS.GET (adr, l); Texts.WriteHex (curView.writer, l); Texts.WriteString (curView.writer, "H ") END; *)
- e := AllocFoldElem (obj, adr, curView.indent + 1, FoldElems.colRight);
- Texts.WriteElem (curView.writer, e)
- END
- ELSE
- Texts.WriteString (curView.writer, "= ");
- ShowValue (curView.writer, obj, adr, reg)
- END CollectProc;
- PROCEDURE GetScope* (VAR w: Texts.Writer; t: Texts.Text; syms: RTDC.Sym; baseAdr: LONGINT; indent: INTEGER);
- PROCEDURE GetLocalScope* (VAR w: Texts.Writer; t: Texts.Text; syms: RTDC.Sym; reg: Sys.ExceptionInfo; indent: INTEGER);
- END RTDD.
-